using System;
using System.Data;
using System.Data.SQLite;
using System.Collections.Generic;
using System.Windows.Forms;

/// <summary>
/// Summary description for Class1
/// </summary>
public class SQLiteDatabase
{
    string dbConnection;
    public SQLiteDatabase()
	{
		//
		// TODO: Add constructor logic here
		//
        dbConnection = "Data Source=sms.db";
	}

    public SQLiteDatabase(string inputFile)
    {
        dbConnection = string.Format("Data Source={0}", inputFile);
    }

    public SQLiteDatabase(Dictionary<string, string> connectionOpts)
    {
        string str = "";
        foreach (KeyValuePair<string, string> row in connectionOpts)
        {
            str += string.Format("{0}={1};", row.Key, row.Value);
        }
        str = str.Trim().Substring(0, str.Length - 1);
        dbConnection = str;
    }

    public DataTable GetDataTable(string sql)
    {
        DataTable dt = new DataTable();
        try
        {
            SQLiteConnection cnn = new SQLiteConnection(dbConnection);
            cnn.Open();
            SQLiteCommand mycommand = new SQLiteCommand(cnn);
            mycommand.CommandText = sql;
            SQLiteDataReader reader = mycommand.ExecuteReader();
            dt.Load(reader);
            reader.Close();
            cnn.Close();
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }
        return dt;
    }

    public int ExecuteNonQuery(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        int rowsUpdated = mycommand.ExecuteNonQuery();
        cnn.Close();
        return rowsUpdated;
    }

    public string ExecuteScalar(string sql)
    {
        SQLiteConnection cnn = new SQLiteConnection(dbConnection);
        cnn.Open();
        SQLiteCommand mycommand = new SQLiteCommand(cnn);
        mycommand.CommandText = sql;
        object value = mycommand.ExecuteScalar();
        cnn.Close();
        if (value != null)
        {
            return value.ToString();
        }
        return "";
    }

    public bool Update(string tableName, Dictionary<string, string> data, string where)
    {
        string vals = "";
        Boolean returnCode = true;
        if (data.Count >= 1)
        {
            foreach(KeyValuePair<string, string> val in data)
            {
                vals += string.Format(" {0} = '{1}',", val.Key.ToString(), val.Value.ToString());
            }
            vals = vals.Substring(0, vals.Length - 1);
        }
        try
        {
            this.ExecuteNonQuery(string.Format("update {0} set {1} where {2};", tableName, vals, where));
        }
        catch
        {
        	returnCode = false;
        }
        return returnCode;
    }

    public bool Delete(string tableName, String where)
    {
        Boolean returnCode = true;
        try
        {
            this.ExecuteNonQuery(string.Format("delete from {0} where {1};", tableName, where));
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message);
            returnCode = false;
        }
        return returnCode;
    }

    public bool Insert(string tableName, Dictionary<string, string> data)
    {
        string columns = "";
        string values = "";
        Boolean returnCode = true;
        foreach (KeyValuePair<string, string> val in data)
        {
            columns += string.Format(" {0},", val.Key.ToString());
            values += string.Format(" '{0}',", val.Value);
        }
        columns = columns.Substring(0, columns.Length - 1);
        values = values.Substring(0, values.Length - 1);
        try
        {
            this.ExecuteNonQuery(string.Format("insert into {0}({1}) values({2});", tableName, columns, values));
        }
        catch (System.Exception ex)
        {
            MessageBox.Show(ex.Message);
            returnCode = false;
        }
        return returnCode;
    }

    public bool ClearDB()
    {
        DataTable tables;
        try
        {
            tables = this.GetDataTable("select NAME from SQLITE_MASTER where type='table' order by NAME;");
            foreach (DataRow table in tables.Rows)
            {
                this.ClearTable(table["NAME"].ToString());
            }
            return true;
        }
        catch
        {
            return false;
        }
    }

    public bool ClearTable(string table)
    {
        try
        {
            this.ExecuteNonQuery(string.Format("delete from {0}", table));
            return true;
        }
        catch
        {
            return false;
        }
    }
}
